#========================================================================
# Disciplina: Uso da Linguagem R para Anlise de Dados em Ecologia - 2014
# Funo: Diagrama de Propores
# Autor: Joyce Rodrigues do Prado 

ratiodiagram<- function(x,name="figura.tif", ngrupos, rmNA=TRUE, erro=TRUE)
	{	
		dados<-x #Nomeia o objeto de entrada
#Se o nmero de grupos for menor ou igual a 1 no  possvel executar a funo e aparece uma mensagem de erro.
		ngrupos<-nlevels(dados[,1])		
		if (ngrupos<=1)
		{
		stop("Ateno! ngrupos deve ser maior que 1.")
		}
#Se o nmero de grupos for maior que 1  a funo executa normalmente.		
		else
		{		
		grupos<-levels(dados[,1]) # mostra quais so os grupos que sero comparados
			if (rmNA==FALSE)
				{
				stop("Ateno! No  possvel executar a funo com NAs.")
				}
			else 
				if (erro==TRUE)
				{
				media<- aggregate(dados[,-1], list(grupos=dados[,1]), mean, na.rm=T) #calcula a mdia de cada varivel em cada grupo
				erro<- aggregate(dados[,-1], list(grupos=dados[,1]), function(x, na.rm = T)2* sd(x, na.rm = T)/sqrt(length(x))) # calcula o erro padro da amostra por varivel
				media_pluserro<-media[,-1]+erro[,-1] # soma o erro padro  mdia
				media_minorerro<-media[,-1]-erro[,-1]# diminui o erro padro da mdia		
				logmedia<- log10(media[,-1]) #logaritmiza a mdia
				logmedia_pluserro<- log10(media_pluserro) #logaritmiza a soma da mdia mais erro padro
				logmedia_minorerro<- log10(media_minorerro)#logaritmiza a diferena da mdia mais erro padro
				comb1 <- expand.grid(x1=nrow(logmedia), x2=1:nrow(logmedia))  #Faz uma combinao dos grupos para calcular a diferena entre as mdias dos grupos
				XSub1 <- logmedia[comb1$x1,] - logmedia[comb1$x2,] #Calcula a diferena entre as mdias dos grupos
				rownames(XSub1) <- paste(comb1$x1, comb1$x2, sep="-") #Muda os nomes das linhas
				transposta1<-t(XSub1) #transpe a matriz pra fazer o grfico
				comb2 <- expand.grid(x1=nrow(logmedia_pluserro), x2=1:nrow(logmedia_pluserro))  #Faz uma combinao dos grupos para calcular a diferena entre a soma da mdia e do erro padro dos grupos
				XSub2 <- logmedia_pluserro[comb2$x1,] - logmedia_pluserro[comb2$x2,] #Calcula a diferena entre a soma da mdia e do erro padro dos grupos
				rownames(XSub2) <- paste(comb2$x1, comb2$x2, sep="-")  #Muda os nomes das linhas
				transposta2<-t(XSub2)#transpe a matriz pra fazer o grfico
				comb3 <- expand.grid(x1=nrow(logmedia_minorerro), x2=1:nrow(logmedia_minorerro))#Faz uma combinao dos grupos para calcular a diferena entre a diferena da mdia e do erro padro dos grupos
 				XSub3 <- logmedia_minorerro[comb3$x1,] - logmedia_minorerro[comb3$x2,] #Calcula a diferena entre a diferena da mdia e do erro padro dos grupos
				rownames(XSub3) <- paste(comb3$x1, comb3$x2, sep="-") #Muda os nomes das linhas
				transposta3<-t(XSub3) #transpe a matriz pra fazer o grfico
				nomeslinhas<-rownames(transposta1) #cria um objeto com o nome das variveis
				i<- length(nomeslinhas) # calcula nmero de variveis
				max2<- max(transposta2, na.rm =TRUE)#achando o maior valor da matriz transposta2 para usar no eixo y do grfico
				max1<- max(transposta1, na.rm =TRUE)#achando o maior valor da matriz transposta1 para usar no eixo y do grfico				
				max3<- max(transposta3, na.rm =TRUE)#achando o maior valor da matriz transposta3 para usar no eixo y do grfico
				min1 <- min(transposta1, na.rm =TRUE)#achando o menor valor da matriz transposta1 para usar no eixo y do grfico
				min2<- min(transposta2, na.rm =TRUE)#achando o menor valor da matriz transposta2 para usar no eixo y do grfico
				min3 <- min(transposta3, na.rm =TRUE)#achando o menor valor da matriz transposta3 para usar no eixo y do grfico
				max<-max(c(max2,max1,max3))#achando o maior valor de todas as transpostas para usar no eixo y do grfico
				min<- min(c(min1,min2,min3))#achando o menor valor de todas as transpostas para usar no eixo y do grfico
#Abre um dispositivo tiff para salvar o grfico.
				tiff(file= name, width=40, height=15, unit="cm", res=300)
#Faz o grfico
				par (family="serif")#fonte
				par(cex= 1)#tamanho dos simbolos
				par (cex.axis=1)#tamanho caracteres dos eixos
				par(cex.lab=1.2)# tamanho legenda dos eixos
				par (tcl=0.3)#posio dos tickmarks
				par(mgp=c(1.3,0.1,0))#distncia da legenda em relao ao eixo
				par(bty="l")#tipo de caixa grfica
				grafico<-matplot(transposta1, lty= c(1,2,3,4,5,6),tcl= -0.2,type="o",xaxt="n", pch=c(0,1,2,3,4,5,6,7,8,9), col="black", xlab="", ylab="", ylim= c(min,max))
				axis (side=1, at= c(1:i),label= nomeslinhas,tck=0)#editando eixo x
				legend("topright", legend = grupos, bty="n", lty= c(1,2,3,4,5,6), pch=c(0,1,2,3,4,5,6,7,8,9))#colocando legenda
				segments (x0=c(1:i), x1=c(1:i), y0= transposta2, y1= transposta3)#colocando barra de erros
				segments (x0= c(1:i-0.1), x1= c(1:i+0.1), transposta2, transposta2)#colocando barra de erros
				segments (x0= c(1:i-0.1), x1= c(1:i+0.1), transposta3, transposta3)#colocando barra de erros
#Fecha o dispositivo tiff.
    				dev.off()#fechando dispositivo
# Retorna no console o grfico de propores
				return("o grfico foi salvo na pasta de trabalho")	
				}
				else
				{
				media<- aggregate(dados[,-1], list(grupos=dados[,1]), mean, na.rm=T) #calcula a mdia de cada varivel em cada grupo
				logmedia<- log10(media[,-1]) #logaritmiza a mdia
				comb1 <- expand.grid(x1=nrow(logmedia), x2=1:nrow(logmedia))  #Faz uma combinao dos grupos para calcular a diferena entre as mdias dos grupos
				XSub1 <- logmedia[comb1$x1,] - logmedia[comb1$x2,] #Calcula a diferena entre as mdias dos grupos
				rownames(XSub1) <- paste(comb1$x1, comb1$x2, sep="-") #Muda os nomes das linhas
				transposta1<-t(XSub1) #transpe a matriz pra fazer o grfico
				nomeslinhas<-rownames(transposta1) #cria um objeto com o nome das variveis
				i<- length(nomeslinhas) # calcula nmero de variveis
								
#Abre um dispositivo tiff para salvar o grfico.
				tiff(file= name, width=40, height=15, unit="cm", res=300)
#Faz o grfico
				par (family="serif")
				par(cex= 1)
				par (cex.axis=1)
				par(cex.lab=1.2)
				par (tcl=0.3)
				par(mgp=c(1.3,0.1,0))
				par(bty="l")
				grafico<-matplot(transposta1, lty= c(1,2,3,4,5,6),tcl= -0.2,type="o",xaxt="n", pch=c(0,1,2,3,4,5,6,7,8,9), col="black", xlab="", ylab="")
				axis (side=1, at= c(1:i),label= nomeslinhas,tck=0)
				legend("topright", legend = grupos, bty="n", lty= c(1,2,3,4,5,6), pch=c(0,1,2,3,4,5,6,7,8,9))
#Fecha o dispositivo tiff.
    				dev.off()
# Retorna no console o grfico de propores
				return("o grfico foi salvo na pasta de trabalho")	
				}
		}
	}		
